package com.zhixi.pattern.important.builderpattern;

import com.zhixi.pattern.important.builderpattern.operation.Director;
import org.junit.Test;

/**
 *
 * 建造者模式
 *
 * 模板方法模式的抽象类直接固定了实现的顺序，如果需要改变实现顺序，则建造者模式就是很好的选择
 *
 * 一个接口（CarBuilder），扩展类实现接口（BenzModel、BMWModel）
 *
 * 建造者类（BenzBuilder、BMWBuilder）进行设置顺序，创建对象
 * 最后由Director类进行组装各种各样的顺序
 *
 * 优点：封装性、扩展性
 *
 * @作者 ShuHaoNan
 * @邮箱 shuhaonan1@gmail.com
 * @时间 2020/11/15 14:53
 */
public class BuilderPattern {

    private Director director = new Director();

    /* 奔驰A系列 */
    @Test
    public void ABenz() {
        director.getABenzModel().run();
    }

    /* 奔驰B系列 */
    @Test
    public void BBenz() {
        director.getBBenzModel().run();
    }

    /* 宝马A系列 */
    @Test
    public void ABMW() {
        director.getABMWModel().run();
    }

    /* 宝马B系列 */
    @Test
    public void BBMW() {
        director.getBBMWModel().run();
    }

    @Test
    public void batch() {
        /* 生成1000辆奔驰A系列 */
        for (int i = 0; i < 1000; i++) {
            director.getABenzModel().run();
        }
        /* 生成2000辆奔驰B系列 */
        for (int i = 0; i < 2000; i++) {
            director.getBBenzModel().run();
        }
        /* 生成3000辆宝马A系列 */
        for (int i = 0; i < 3000; i++) {
            director.getABMWModel().run();
        }
        /* 生成4000辆宝马B系列 */
        for (int i = 0; i < 4000; i++) {
            director.getBBMWModel().run();
        }
    }

}
